﻿import csv
import math
import os


def calc_map_no(e, n):
    """计算图幅号，按照格式要求输出图幅号

    Args:
        n (_type_): 北坐标
        e (_type_): 东坐标

    Returns:
        _type_: 2125-1060-3-Ⅰ
    """

    # 计算图幅的左下角东、北坐标
    e_base = int((e // 2500) * 2500)
    n_base = int((n // 2000) * 2000)

    # 取4位左下角图幅号，不够补零
    e_base_str = f"{e_base:04d}"[:4]
    n_base_str = f"{n_base:04d}"[:4]

    # 计算在2500*2000图幅内的相对坐标
    e_in_big = e - e_base
    n_in_big = n - n_base

    # 计算在2500*2000图幅内的行列号，row-行；col-列
    mid_col = math.ceil(e_in_big / 500)
    mid_row = math.ceil(n_in_big / 400)
    mid_no = 5 * (mid_row - 1) + mid_col

    # 计算在中矩形的相对坐标
    e_in_mid = e_in_big % 500
    n_in_mid = n_in_big % 400

    # 判断小矩形的罗马数字   Ⅰ Ⅱ Ⅲ Ⅳ
    is_north = n_in_mid >= 200
    is_east = e_in_mid >= 250

    if is_north:
        if is_east:
            roman = "Ⅱ"
        else:
            roman = "Ⅰ"
    else:
        if is_east:
            roman = "Ⅳ"
        else:
            roman = "Ⅲ"

    # 组合图幅号
    return f"{e_base_str}-{n_base_str}-{mid_no}-{roman}"


print(calc_map_no(213688.437, 106240.376))

def process_csv(input_file, replace_original=True):
    """读取CSV文件，计算图幅号追加到每行的末尾"""
    # 确定输出文件名（在源文件后追加“_with_mapno”）

    file_dir, file_name = os.path.split(input_file)
    base_name, ext = os.path.splitext(file_name)
    output_file = os.path.join(file_dir, f"{base_name}_with_mapno{ext}")
    # 读取csv文件
    with open(input_file, "r", newline="", encoding="utf-8") as infile:
        reader = csv.reader(infile)

        with open(output_file, "w", newline="", encoding="utf-8") as outfile:
            writer = csv.writer(outfile)
            # 读取并写入表头
            header = next(reader)
            writer.writerow(header + ["图幅号"])
            # 处理每一行数据
            for row in reader:
                try:
                    # 点名，X，Y
                    # name = str(row['ExpNo'])
                    north = float(row[1])
                    east = float(row[2])

                    # 计算图幅号
                    map_no = calc_map_no(east, north)
                    # 写入新行（原始数据+图幅号）
                    writer.writerow(row + [map_no])
                except (ValueError, IndexError) as e:
                    # 处理数据转换错误或者列数不足的情况
                    print(f"处理{row}行时出错：{e}")
                    # 保留原始行，图幅号标记为错误
                    writer.writerow(row + ["ERROR"])

    print(f"处理完成，结果已保存到：{output_file}")


def batch_process_csv(input_dir, replace_original=True):
    """批量处理文件夹下CSV文件"""

    if not os.path.exists(input_dir):
        print(f"❌错误：文件夹{input_dir}不存在")
        return
    if not os.path.isdir(input_dir):
        print(f"❌错误：{input_dir}不是一个有效的文件夹")
        return

    # 获取文件夹下所有CSV文件
    csv_files = [f for f in os.listdir(input_dir) if f.lower().endswith(".csv")]

    if not csv_files:
        print(f"在{input_dir}中没有找到csv文件")
        return

    print(f"共找到{len(csv_files)}个CSV文件，开始处理...")

    # 处理每个CSV文件
    for csv_file in csv_files:
        file_path = os.path.join(input_dir, csv_file)
        process_csv(file_path)

    print(f"✓批量处理完成！共处理{len(csv_files)}个文件。")


if __name__ == "__main__":
    """
    # 输入实际CSV文件路径
     csv_file_path = input("请输入CSV文件路径：").strip()

    if os.path.exists(csv_file_path) and os.path.isfile(csv_file_path):
        process_csv(csv_file_path)
    else:
        print(f"错误：文件'{csv_file_path}'不存在或者不是有效文件")
    """

    # 输入文件夹路径
    folder_path = input("请输入CSV所在的文件夹路径：").strip()

    # 执行批量处理
    batch_process_csv(folder_path)
